package sf.database.jdbc.sql;

import sf.common.wrapper.Page;
import sf.core.DBObject;
import sf.dsl.DeleteDSL;
import sf.dsl.InsertDSL;
import sf.dsl.UpdateDSL;
import sf.dsl.example.Example;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * 按example操作
 */
public interface CrudExampleInf {
    /**
     * @param conn
     * @param start
     * @param limit
     * @param beanClass
     * @param example
     * @param <T>
     * @return
     */
    <T> Page<T> selectPage(Connection conn, long start, int limit, Class<T> beanClass, Example example);

    /**
     * @param conn
     * @param example
     * @return
     * @
     */
    Object[] selectArray(Connection conn, Example example);

    /**
     * @param conn
     * @param beanClass
     * @param example
     * @param <T>
     * @return
     * @
     */
    <T> List<T> selectList(Connection conn, Class<T> beanClass, Example example);

    /**
     * @param conn
     * @param beanClass
     * @param start
     * @param limit
     * @param example
     * @param <T>
     * @return
     */
    <T> List<T> selectList(Connection conn, Class<T> beanClass, long start, int limit, Example example);


    /**
     * @param conn
     * @param beanClass
     * @param example
     * @param <T>
     * @return
     */
    <T> List<T> selectListForUpdate(Connection conn, Class<T> beanClass, Example example);

    /**
     * @param conn
     * @param beanClass
     * @param example
     * @param <T>
     * @return
     * @
     */
    <T> T selectOne(Connection conn, Class<T> beanClass, Example example);

    /**
     * @param conn
     * @param beanClass
     * @param example
     * @param <T>
     * @return
     */
    <T> T selectOneForUpdate(Connection conn, Class<T> beanClass, Example example);

    /**
     * @param conn
     * @param example
     * @return
     * @
     */
    List<Map<String, Object>> select(Connection conn, Example example);

    /**
     * @param conn
     * @param insertDSL
     * @param datas     如果需要主键返回,可以放入一个空list
     * @return
     */
    int insert(Connection conn, InsertDSL insertDSL, List<DBObject> datas);

    /**
     * DSL更新
     * @param conn
     * @param updateDSL
     * @return
     */
    int update(Connection conn, UpdateDSL updateDSL);

    /**
     * DSL删除
     * @param conn
     * @param deleteDSL
     * @return
     */
    int delete(Connection conn, DeleteDSL deleteDSL);
}
